package com.yang.rabbitmq.simple;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;


/**
 * ClassName: Producer
 * Description:
 * Date: 2021/4/7 20:55
 *
 * @author YangXin
 */
public class Producer {

    public static void main(String[] args) {
        //所有的中间件技术都是基于tcp/ip协议基础上构建新型的协议规范,只不过rabbitmq遵循的是amqp协议
        //1. 创建连接工程
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setHost("39.105.46.187");
        connectionFactory.setPort(5672);
        connectionFactory.setUsername("admin");
        connectionFactory.setPassword("admin");
        connectionFactory.setVirtualHost("/");

        Connection connection = null;
        Channel channel = null;
        try {
            //2. 创建连接Connection RabbitMQ是基于channel处理而不是基于连接,因为连接会进行握手耗费时间并且开闭极度消耗资源
            connection = connectionFactory.newConnection("生产者");
            //3. 通过连接获取通道Channel
            channel = connection.createChannel();
            //4. 通过创建交换机,声明队列,绑定关系,路由key,发送消息和接收消息
            String queueName = "queue1";

            /*
             * @params1 队列名称
             * @params2 是否要持久化durable = false 所谓持久化消息是否存盘,如果false 非持久化 true是持久化? 非持久化会存盘么?
             * @params3 排他性,是否是独占独立
             * @params4 是否自动删除,随着最后一个消费者消息完毕消息之后是否把队列自动删除
             * @params5 携带附属参数
             */
            channel.queueDeclare(queueName, false, false, false, null);
            //5. 准备消息内容
            String mes = "杨鑫";
            //6. 发送消息给队列queue
            /*
            * @params1 交换机
            * @params2 队列名称
            * @params3 消息的状态控制
            * @params4 消息主题
            */
            channel.basicPublish("", queueName, null, mes.getBytes());
            System.out.println("消息发送成功!!!!");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //7. 关闭通道
            if (channel != null && channel.isOpen()) {
                try {
                    channel.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            //8. 关闭连接
            if (connection != null && connection.isOpen()) {
                try {
                    connection.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }


    }

}
